package pri.hillchen.std.concurrent.chapter14.boundedbuffer;

/**
 * @author:hillchen
 * @DESCRIPTION: 自定义同步工具：有界缓存抽象类,通过环形数组队列来实现。
 * @Date: Created in 9:48 2018/2/13 0013.
 *
 *
 */
public abstract class BaseBoundedBuffer<V> {
    /**
     * 元素缓存数组对象
     */
    private final V[] buf;
    /**
     * 缓存尾指针
     */
    private int tail;
    /**
     * 缓存头指针
     */
    private int head;
    /**
     * 缓存size
     */
    private int count;

    protected BaseBoundedBuffer(int capacity) {
        this.buf = (V[]) new Object[capacity];
    }

    /**
     * 内部添加元素操作：在数组尾部添加元素，添加成功后同时修改尾指针(当当前尾指针已在数组尾部时，重置为0)和缓存计算器
     * @param ele
     */
    protected synchronized final void doPut(V ele){
        buf[tail] = ele;
        if(++tail == buf.length){
            tail = 0;
        }
        ++ count;
    }

    /**
     * 内部获取元素操作：在数组头部获取元素，获取成功后先清除缓存数组上当前头部内容以防止对象泄露，然后修改头指针和缓存计算器
     * @return
     */
    protected synchronized  final V doTake(){
        V ret = buf[head];
        buf[head] = null;
        if( ++head == buf.length){
            head = 0;
        }
        -- count;
        return ret;
    }

    /**
     * 判断缓存是否已满，如果已满则返回true
     * @return
     */
    public synchronized final boolean isFull(){
        return count == buf.length;
    }

    /**
     * 判断缓存是否为空，如果为空，则返回true
     * @return
     */
    public synchronized final boolean isEmpty(){
        return  count == 0;
    }
}
